package com.qcby.demo.annotation;

// 银行服务类，进行转账
public class BankService {
    private Account accountA;
    private Account accountB;

    public BankService(Account accountA, Account accountB) {
        this.accountA = accountA;
        this.accountB = accountB;
    }

    @Transactional  // 表示这个方法需要事务支持。
    public void transfer(int amount) {
        System.out.println("转账操作开始...");
        if (amount > accountA.getBalance()) {
            throw new IllegalArgumentException("余额不足");
        }
        accountA.debit(amount);
        accountB.credit(amount);
        System.out.println("转账操作完成");
    }

    /**
     * initiateTransfer(int amount) 方法创建了一个匿名类
     * 实现 TransactionalMethodInvoker 接口，
     * 通过该接口的 invoke 和 rollback 方法处理业务逻辑和事务管理。
     * @param amount
     */
    public void initiateTransfer(int amount) {
        TransactionManager transactionManager = new TransactionManager();
        TransactionalMethodInvoker invoker = new TransactionalMethodInvoker() {
            @Override
            public void invoke() throws Exception {
                transfer(amount);
            }

            @Override
            public void rollback() {
                // 回滚：将钱从目标账户转回源账户
                accountB.debit(amount);
                accountA.credit(amount);
                System.out.println("回滚：从 " + accountB.getName() + " 转回到 " + accountA.getName());
            }
        };

        transactionManager.executeTransaction(invoker);
    }
}
